from django.shortcuts import render

# Create your views here.
from rest_framework.response import Response

"""

1. 获取code
2. 通过code换取token
3. 通过token 换去 openid


"""

"""
用户点击 qq登录按钮的时候,前端应该发送一个 ajax请求,来获取要跳转的url

 这个url 是根据 腾讯的文档来生成的 跳转到腾讯页面

 GET   /oauth/qq/statues/

"""
from rest_framework.views import APIView
#生成qqurl的模块
from QQLoginTool.QQtool import OAuthQQ
from mall import settings
      #认证
class OauthQQURLView(APIView):

    def  get(self,request):

        #成功后跳转的url
        state = '/'

        # 1.创建 oauth对象
        # client_id=None, client_secret=None, redirect_uri=None, state=None
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI,
                        state=state)

        #调用方法 获取url
        #注意和前段传递参数一致
        login_url = oauth.get_qq_url()
        # login_url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&redirect_uri=http%3A%2F%2Fwww.meiduo.site%3A8080%2Foauth_callback.html&state=%2F&client_id=101474184'
        #返回一个字典
        return Response({'login_url': login_url})
"""
前段应该 在用户扫描完成之后,跳转到 http://www.meiduo.site:8080/oauth_callback.html?code=6E2E3F64C34ECFE29222EBC390D29196&state=test
把code 传递给后端,

GET     /oauth/qq/users/?code=xxx

# 1.我们获取到这个code, 通过接口来换去 token
# 2.有了token,就可以换取 oepnid

"""
from rest_framework import status
from .models import OAuthQQUser
from .serializers import OauthQQUserSerializer
from .utils import generic_access_token,get_token

class OauthQQUserView(APIView):

    def get(self,request):

        code = request.query_params.get('code')
        #判断是否为空
        if code is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        #获取这个code 用过接口去换取token
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        #调用方法获取token
        access_token = oauth.get_access_token(code)
        #用换取的toke 换取openid
        openid = oauth.get_open_id(access_token)
        # 3. 我们需要根据openid来进行判断
        # 如果数据库中 有oepnid 则表明用户已经绑定过了
        # 如果数据库中 没有openid 则表明用户没有绑定过了,应该显示绑定界面
        #取出openid对应的列表
        try:
            qquser = OAuthQQUser.objects.get(openid=openid)
        except  OAuthQQUser.DoesNotExist:
            #并没有绑定  返回绑定页面一个openid帮助绑定
            '''
             1.对敏感数据进行处理
             2.数据需要一个有效期
            '''
            #我们要对openid进行处理
            openid = generic_access_token(openid)
            return Response({'access_token':openid})

        else:
            # 说明存在, 用户已经绑定过来了,绑定过应该登录
            # 既然是登录,则应该返回token
            # 没有异常 走 else
            # 应为网站是用token进行认证登陆的 所以需要生成token 并返回
            from rest_framework_jwt.settings import api_settings
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            payload = jwt_payload_handler(qquser.user)
            token = jwt_encode_handler(payload)

            return Response({
                'user_id':qquser.user.id,
                'username':qquser.user.username,
                'token':token
            })



#在用户没有绑定的情况下 就会跳转页面  这时候用户会绑定下面是绑定按钮的视图
    """
    用户点击绑定按钮的时候,前端应该将 手机号,密码,openid,sms_code 发送给后端
    1. 接收数据
    2. 对数据进行校验
        2.1 校验 openid 和sms_code
        2.2 判断手机号
            如果注册过,需要判断 密码是否正确
            如果没有注册过,创建用户
    3. 保存数据
        3.1保存 user 和 openid
    4. 返回响应
    POST
    """
    def post(self,request):
        #接受数据
        data = request.data
        #进行校验
        # 2. 对数据进行校验
        #     2.1 校验 openid 和sms_code
        #     2.2 判断手机号
        #         如果注册过,需要判断 密码是否正确
        #         如果没有注册过,创建用户
        #生成序列化器进行校验
        serializer = OauthQQUserSerializer(data=data)
        serializer.is_valid(raise_exception=True)
        #保存数据
        qquser = serializer.save()

        #返回响应
        return  get_token(qquser)










#加密签名   对长时间不绑定的情况进行  无效化处理
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from mall import settings

#创建序列化器
#secret_key      秘钥一般实用个工程配置里的秘钥
#expires_in - None   有效时间 单位为秒
#调用加密签名方法 并进行加密配置   加密秘钥和有效时间
serializer = Serializer(settings.SECRET_KEY,100)

#组织加密数据
data = {'openid':'123456789'}

#进行加密处理
token = serializer.dumps(data)
'''
类似 token 的二进制  加密密码
b'eyJhbGciOiJIUzI1NiIsImV4cCI6MTU0MTczMDY0NCwiaWF0IjoxNTQxNzMwNTQ0fQ.
eyJvcGVuaWQiOiIxMjM0NTY3ODkifQ.
hZk9AADHl6Z4V72PEDBkszvlzBUlXvt2VboPSG-zoyE'

'''
#注意  生成的秘钥无法进行修改或添加
#有效期过期也会 报错

#对数据进行解密
serializer.loads(token)


#加密签名
serializer = Serializer(settings.SECRET_KEY)
#加密数据
time = {'openid':'卢本伟牛逼'}
#调用加密方法
token = serializer.dumps(time)
#解密
serializer.loads(token)
